#include "ImageAlgorithmManager.h"
#include <QDir>
#include <QDebug>
#include <QCoreApplication>
#include <QString>
#include <QPluginLoader>
#include <QWidget>
#include "ImageProcessingAlgorithmBase.h"

/**
 * @brief ImageAlgorithmManager构造函数
 * 初始化算法管理器，创建空的算法映射容器
 * @param parent 父对象指针
 */
ImageAlgorithmManager::ImageAlgorithmManager(QObject *parent) : QObject(parent)
{
}

/**
 * @brief ImageAlgorithmManager析构函数
 * 负责清理所有已加载的算法实例和插件加载器，防止内存泄漏
 * - 遍历所有算法实例，释放内存
 * - 卸载所有插件并释放加载器内存
 * - 清空所有映射容器
 */
ImageAlgorithmManager::~ImageAlgorithmManager()
{
    // 释放所有算法实例和加载器
    for (auto it = m_algorithms.begin(); it != m_algorithms.end(); ++it) {
        ImageProcessingAlgorithmBase *algorithm = it.value();
        if (algorithm) {
            delete algorithm;
        }

        if (m_loaders.contains(it.key())) {
            QPluginLoader *loader = m_loaders[it.key()];
            if (loader && loader->isLoaded()) {
                loader->unload();
            }
        }
    }
    m_algorithms.clear();
    m_loaders.clear();
}

/**
 * @brief 初始化算法管理器
 * 从应用程序目录下的ImageProcessingAlgorithm文件夹中加载所有算法插件
 */
void ImageAlgorithmManager::initialize()
{
    // 获取应用程序运行目录
    QString appDir = QCoreApplication::applicationDirPath();

    // 构建图像处理算法目录路径
    QString algorithmDir = appDir + "/ImageProcessingAlgorithm";

    loadAlgorithm(algorithmDir);
}

/**
 * @brief 处理算法参数设置widget注册
 * 存储算法对应的参数设置widget，并发出信号通知UI组件
 * @param algorithmName 算法名称
 * @param widget 参数设置widget，可能为nullptr
 * @param iconPath 算法图标路径
 */
void ImageAlgorithmManager::onAlgorithmWidgetRegistered(const QString &algorithmName, QWidget *widget, const QString& iconPath)
{
    // 存储注册的widget
    m_algorithmWidgets[algorithmName] = widget;
    qDebug() << "Algorithm widget registered: " << algorithmName;

    // 发出widget就绪信号，通知UI组件可以显示参数设置界面
    emit algorithmWidgetReady(algorithmName, widget, iconPath);
}

/**
 * @brief 获取所有已加载的算法
 * @return 算法名称到算法实例的映射
 */
QMap<QString, ImageProcessingAlgorithmBase*> ImageAlgorithmManager::algorithms() const
{
    return m_algorithms;
}

/**
 * @brief 根据算法名称获取算法实例
 * @param name 算法名称
 * @return 找到的算法实例指针，若不存在则返回nullptr
 */
ImageProcessingAlgorithmBase* ImageAlgorithmManager::getAlgorithm(const QString& name) const
{
    if (m_algorithms.contains(name)) {
        return m_algorithms.value(name);
    }
    return nullptr;
}

/**
 * @brief 从指定路径加载算法插件
 * 遍历目录中的所有文件，尝试加载并初始化符合要求的DLL插件
 * @param dllPath 算法DLL所在目录路径
 */
void ImageAlgorithmManager::loadAlgorithm(const QString& dllPath)
{
    // 检查目录是否存在
    QDir dir(dllPath);
    if (!dir.exists()) {
        qWarning() << "Image processing algorithm directory not found: " << dllPath;
        return;
    }
    
    // 遍历目录下所有DLL文件
    for (const QString &fileName : dir.entryList(QDir::Files)) {
        // 创建插件加载器
        QPluginLoader *loader = new QPluginLoader(dir.filePath(fileName));
        QObject *plugin = loader->instance();
        
        if (plugin) {
            // 验证是否实现图像处理算法接口
            ImageProcessingAlgorithmBase *algorithm = qobject_cast<ImageProcessingAlgorithmBase*>(plugin);
            if (algorithm) {
                QString algorithmName = algorithm->algorithmName();
                m_algorithms[algorithmName] = algorithm;
                m_loaders[algorithmName] = loader;
                qDebug() << "Successfully loaded algorithm: " << algorithmName << " from " << fileName;

                // 连接算法的注册widget信号到管理器的槽函数
                connect(algorithm, &ImageProcessingAlgorithmBase::registerAlgorithmWidget,
                        this, &ImageAlgorithmManager::onAlgorithmWidgetRegistered);
                
                // 连接算法的图像处理完成信号到转发槽函数
                connect(algorithm, &ImageProcessingAlgorithmBase::imageProcessed,
                        this, [this, algorithm](const QString& imageId, const QImage& processedImage,bool isPretreatment) {
                    emit imageProcessingCompleted(imageId, processedImage, algorithm->algorithmName(),isPretreatment);
                });

                // 调用初始化方法，发射注册widget信号
                algorithm->initialize();
            } else {
                qWarning() << "Plugin does not implement ImageProcessingAlgorithmBase interface: " << fileName;
                loader->unload();
                delete loader;
            }
        } else {
            // 加载失败，记录错误并释放加载器
            qWarning() << "Failed to load plugin: " << fileName << " Error: " << loader->errorString();
            delete loader;
        }
    }
}
